#pragma once

#include <Arduino.h>
#include "Screen.h"
#include "Keys.h"

// 贪吃蛇游戏类
class Snake {
public:
  // 游戏入口函数
  void main(Screen &screen, Keys &keys);

private:
  // 游戏状态枚举
  enum GameState {
    MENU,      // 菜单状态
    PLAYING,   // 游戏中
    PAUSED,    // 暂停
    GAME_OVER  // 游戏结束
  };

  // 方向枚举
  enum Direction {
    UP,
    DOWN,
    LEFT,
    RIGHT
  };

  // 蛇的身体节点结构
  struct SnakeNode {
    int x;
    int y;
    SnakeNode *next;
  };

  // 游戏参数
  static const int GRID_SIZE = 10;       // 网格大小
  static const int GRID_WIDTH = 24;      // 游戏区域宽度(格子数)
  static const int GRID_HEIGHT = 46;     // 游戏区域高度(格子数)
  static const int GAME_AREA_X = 0;      // 游戏区域X起始位置
  static const int GAME_AREA_Y = 30;     // 游戏区域Y起始位置
  static const int INITIAL_LENGTH = 3;   // 初始蛇长度
  static const int INITIAL_SPEED = 150;  // 初始速度(ms)

  // 游戏变量
  GameState gameState;
  Direction currentDirection;
  Direction nextDirection;
  SnakeNode *head;
  int foodX, foodY;
  int score;
  int speed;
  unsigned long lastMoveTime;

  // 私有方法
  void initGame();
  void drawMenu(Screen &screen);
  void drawGame(Screen &screen);
  void drawGameOver(Screen &screen);
  void handleInput(Keys &keys);
  void updateGame();
  void moveSnake();
  void generateFood();
  bool checkCollision();
  bool checkFoodCollision();
  void growSnake();
  void freeSnake();
  int getSnakeLength();
};